
package com.naza.rpc.netty;

import com.naza.rpc.model.RpcRequest;
import org.apache.commons.lang3.reflect.MethodUtils;
import org.apache.commons.lang3.time.StopWatch;

/**
 * 方法的反射调用(记录执行时间)
 * 
 * @author yl
 */
public class MethodInvoker {
    private Object serviceBean;

    // 用于记录代码执行时间(此处用于记录反射调用业务方法的时间)
    // split:设置一个停止时间，可以提取从start到split的时间
    private StopWatch sw = new StopWatch();

    public Object getServiceBean() {
        return serviceBean;
    }

    public void setServiceBean(Object serviceBean) {
        this.serviceBean = serviceBean;
    }

    /**
     * 反射调用
     * 
     * @param request
     * @return
     * @throws Throwable
     */
    public Object invoke(RpcRequest request) throws Throwable {
        // 方法名
        String methodName = request.getMethodName();
        // 参数
        Object[] parameters = request.getParametersVal();
        // 清除数据，以便对象复用
        sw.reset();
        // 启动一个时间会话，会清除以前所有的数据
        sw.start();
        // 反射调用
        Object result = MethodUtils.invokeMethod(serviceBean, methodName, parameters);
        // 停止一个时间会话
        sw.stop();
        return result;
    }

    /**
     * 获取调用时间
     * 
     * @return
     */
    public long getInvokeTimespan() {
        return sw.getTime();
    }
}
